package com.carrot.common.mybatis;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.carrot.common.utils.WrapperUtil;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;

import java.io.Serializable;
import java.util.List;

/**
 * 分页类
 *
 * @author 刘红真
 */
@Slf4j
@Getter
@Setter
public class Page<T, V> implements Serializable {

  private static final long serialVersionUID = 1L;

  private long total;
  private List<T> tList;
  private List<V> vList;

  private int pageNo = 1;
  private int pageSize = 10;

  /** 查询条件构造器 */
  private QueryWrapper<T> queryWrapper;

  public Page() {
    super();
  }

  /**
   * 分页 构造函数
   *
   * @param pageNo 页
   * @param pageSize 分页大小
   */
  public Page(int pageNo, int pageSize) {
    super();
    this.pageNo = pageNo;
    this.pageSize = pageSize;
  }

  /**
   * 分页 构造函数
   *
   * @param pageNo 页
   * @param pageSize 分页大小
   * @param queryWrapper 查询条件
   */
  public Page(int pageNo, int pageSize, QueryWrapper<T> queryWrapper) {
    super();
    this.pageNo = pageNo;
    this.pageSize = pageSize;
    this.queryWrapper = queryWrapper;
  }

  /**
   * 获取分页数据
   *
   * @return map对象
   */
  public PageData getPageData() {
    PageData pageData = new PageData();
    pageData.setRows(this.tList);
    pageData.setTotal(Math.toIntExact(this.total));
    return pageData;
  }

  /**
   * 获取分页数据
   *
   * @return map对象
   */
  public PageData getPageDataVo(Class<V> clazz) {
    this.vList = WrapperUtil.transform(this.getTList(), clazz);

    PageData pageData = new PageData();
    pageData.setRows(this.vList);
    pageData.setTotal(Math.toIntExact(this.total));
    return pageData;
  }

  /**
   * 获取分页数据
   *
   * @return map对象
   */
  public PageData getPageDataVo2() {
    PageData pageData = new PageData();
    pageData.setRows(this.vList);
    pageData.setTotal(Math.toIntExact(this.total));
    return pageData;
  }

  /** 分页对象 */
  @Data
  public static class PageData {

    /** 条数 */
    private Integer total;

    /** 行 */
    private List<?> rows;
  }
}
